home *** CD-ROM | disk | FTP | other *** search
/ Graphics Plus / Graphics Plus.iso / msdos / raytrace / pov / gen / bstone / borlandc / vector.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-03-03  |  2.2 KB  |  108 lines

  1. #include "vector.h"
  2.  
  3. SKALAR distance(VECTOR a,VECTOR b)
  4. { VECTOR vtmp;
  5.   vecsub(vtmp,a,b);
  6.   return(vecabs(vtmp));
  7. }
  8.  
  9.  
  10. void vecprod(VECTOR r,VECTOR a,VECTOR b)
  11. { VECTOR vtmp;
  12.   vtmp[0]=(a)[1]*(b)[2]-(a)[2]*(b)[1],
  13.   vtmp[1]=(a)[2]*(b)[0]-(a)[0]*(b)[2],
  14.   vtmp[2]=(a)[0]*(b)[1]-(a)[1]*(b)[0],
  15.   vecasn(r,vtmp);
  16.   return;
  17. }
  18.  
  19. void norm(VECTOR r, VECTOR a)
  20. { double dd;
  21.   dd=1/vecabs(a),
  22.   vecmul(r,dd,a);
  23.   return;
  24. }
  25.  
  26. void mknormal(VECTOR r,VECTOR v1,VECTOR v2,VECTOR v3)
  27. {
  28.  VECTOR vtmp1,vtmp2;
  29.  vecsub(vtmp1,v2,v1),
  30.  vecsub(vtmp2,v3,v1),
  31.  vecprod(r,vtmp1,vtmp2);
  32.  return;
  33. }
  34.  
  35. void transformc(VECTOR r,VECTOR a,VECTOR u,VECTOR v,VECTOR w)
  36. {
  37.  VECTOR vtmp;
  38.  vtmp[0]=(a)[0]*(u)[0]+(a)[1]*(v)[0]+(a)[2]*(w)[0],
  39.  vtmp[1]=(a)[0]*(u)[1]+(a)[1]*(v)[1]+(a)[2]*(w)[1],
  40.  vtmp[2]=(a)[0]*(u)[2]+(a)[1]*(v)[2]+(a)[2]*(w)[2],
  41.  veccpy(r,vtmp);
  42.  return;
  43. }
  44.  
  45. int transformd(VECTOR r,VECTOR a,VECTOR u,VECTOR v,VECTOR w)
  46. {
  47.  double dd;
  48.  VECTOR vtmp;
  49.  if((dd=det(u,v,w))==0) return(0);
  50.  
  51.  vtmp[0]=det(a,v,w)/dd,
  52.  vtmp[1]=det(u,a,w)/dd,
  53.  vtmp[2]=det(u,v,a)/dd,
  54.  vecasn(r,vtmp);
  55.  return(1);
  56. }
  57.  
  58.  
  59.  
  60. void rotxyz(VECTOR r,VECTOR a,VECTOR b)
  61. {
  62.  SKALAR stmp1,stmp2,stmp;
  63.  
  64.  if(a[0]!=0)
  65.    {
  66.     stmp1=cos(a[0]), stmp2=sin(a[0]);
  67.     (r)[0]=(b)[0],
  68.     stmp  =(b)[1]*stmp1-(b)[2]*stmp2,
  69.     (r)[2]=(b)[1]*stmp2+(b)[2]*stmp1,
  70.     (r)[1]=stmp;
  71.    }
  72.  else
  73.    vecasn(r,b);
  74.  if(a[1]!=0)
  75.    {
  76.     stmp1=cos(a[1]), stmp2=sin(a[1]);
  77.     stmp  =(r)[0]*stmp1+(r)[2]*stmp2,
  78.     (r)[2]=(r)[2]*stmp1-(r)[0]*stmp2,
  79.     (r)[0]=stmp;
  80.    }
  81.  
  82.  if(a[2]!=0)
  83.    {
  84.     stmp1=cos(a[2]),stmp2=sin(a[2]);
  85.     stmp  =(r)[0]*stmp1-(r)[1]*stmp2,
  86.     (r)[1]=(r)[0]*stmp2+(r)[1]*stmp1,
  87.     (r)[0]=stmp;
  88.    }
  89.  return;
  90. }
  91.  
  92. void getrotxyz(VECTOR r,VECTOR a,VECTOR b,VECTOR c)
  93. {
  94.   VECTOR vtmp,vtmp1,vtmp2;
  95.  
  96.   norm(vtmp,a); norm(vtmp1,b); norm(vtmp2,c);
  97.   if((vtmp[0]==0) && (vtmp[1]==0))
  98.     if(vtmp[2]>0)
  99.       { (r)[0]=0; (r)[1]=-M_PI/2; (r)[2]=atan2(-vtmp2[1],-vtmp2[0]);}
  100.     else
  101.       { (r)[0]=0; (r)[1]= M_PI/2; (r)[2]=atan2( vtmp2[1], vtmp2[0]);}
  102.   else
  103.     { (r)[0]=atan2(vtmp1[2],vtmp2[2]);
  104.       (r)[1]=-atan2(vtmp[2],sqrt(vtmp[0]*vtmp[0]+vtmp[1]*vtmp[1]));
  105.       (r)[2]=atan2(vtmp[1],vtmp[0]); }
  106.  
  107.  return;
  108. }